import { myEval } from "./usualUtil"

const regex = /^\$:/

/**
 * 根据路径获取表单属性值
 * 
 * 此函数旨在从一个给定的路径中提取表单属性值路径可以是一个描述属性的字符串，
 * 或者一个直接包含属性值的对象如果路径是字符串且符合预期格式，则函数尝试
 * 通过动态评估路径来获取属性值；否则，直接返回路径对象
 * 
 * @param {string} path - 属性路径字符串或包含属性值的对象
 * @param {object} context - 执行环境对象，用于动态评估路径
 * @param {string} errorMsg - 当发生错误时，用于指定错误信息
 * @returns {any} - 动态获取的属性值或原始路径对象
 */
export function getFormProps(path, context, errorMsg) {
    try {
        // 检查路径是否为字符串且符合预期格式，然后动态评估路径获取属性值
        if (typeof path === 'string' && regex.test(path)) {
            return myEval(this, path.replace('$:', ''), context)
        } else {
            // 如果路径不符合格式或不是字符串，直接返回路径对象
            return path
        }
    } catch (val1) {
        // 错误处理：如果提供了错误消息，输出错误信息
        if (errorMsg) {
            console.error(errorMsg, val1);
        }
    }
}


/**
 * 递归地处理对象，将其所有属性转换为适用于表单的属性
 * 此函数旨在处理复杂的对象结构，将其转换为易于在表单中使用的格式
 * 它通过检查每个属性的类型，并根据其类型递归处理或转换为表单属性
 * 
 * @param {Object|string} obj - 要处理的对象或字符串当为对象时，函数将递归处理其所有属性当为字符串时，函数将其转换为表单属性
 * @param {Object} context - 上下文对象，包含一些全局配置或数据这用于在转换过程中提供额外的信息或配置
 * @returns {Object|string} - 处理后的对象或字符串，具体返回类型取决于输入的类型
 */
export function getFormPropsForObj(obj, context) {
    try {
        // 检查obj是否为非数组对象，以便进行递归处理
        if (obj && typeof obj === 'object' && !Array.isArray(obj)) {
            const keys = Object.keys(obj)
            for (let key of keys) {
                obj[key] = getFormPropsForObj(obj[key], context);
            }
            return obj
        } else if (typeof obj === 'string') {
            // 如果obj是字符串，调用getFormProps函数将其转换为表单属性
            return getFormProps(obj, context)
        }
    } catch (error) {
        // 捕获并记录处理过程中的错误
        console.error('Error in getFormPropsForObj:', error)
    }
}